package com.gexiaobao.pigeon.app.base

import android.os.Bundle
import android.view.View
import android.widget.ImageView
import androidx.appcompat.widget.AppCompatImageView
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.Lifecycle
import com.flyjingfish.openimagelib.OpenImage
import com.flyjingfish.openimagelib.enums.MediaType
import com.gexiaobao.pigeon.R
import com.gexiaobao.pigeon.app.ext.dismissLoadingExt
import com.gexiaobao.pigeon.app.ext.hideSoftKeyboard
import com.gexiaobao.pigeon.app.ext.isLoadingShow
import com.gexiaobao.pigeon.app.ext.showLoadingExt
import com.gexiaobao.pigeon.app.util.LoadingUtil
import com.gexiaobao.pigeon.app.util.StatusBarUtil
import kotlinx.coroutines.Job
import me.hgj.jetpackmvvm.base.fragment.BaseVmDbFragment
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel

/**
 * 作者　: hegaojian
 * 时间　: 2019/12/21
 * 描述　: 你项目中的Fragment基类，在这里实现显示弹窗，吐司，还有自己的需求操作 ，如果不想用Databind，请继承
 * BaseVmFragment例如
 * abstract class BaseFragment<VM : BaseViewModel> : BaseVmFragment<VM>() {
 */
abstract class BaseFragment<VM : BaseViewModel, DB : ViewDataBinding> : BaseVmDbFragment<VM, DB>() {

    var job: Job? = null

    abstract override fun initView(savedInstanceState: Bundle?)

    /**
     * 懒加载 只有当前fragment视图显示时才会触发该方法
     */
    override fun lazyLoadData() {}

    /**
     * 创建LiveData观察者 Fragment执行onViewCreated后触发
     */
    override fun createObserver() {}

    /**
     * Fragment执行onViewCreated后触发
     */
    override fun initData() {

    }

    /**
     * 有需要的地方设置沉浸式状态栏
     */
    open fun setStatusBarTranslucent() {
        activity?.let { StatusBarUtil.setTranslucentForImageView(it, 0, null) }
        activity?.let { StatusBarUtil.setLightMode(it) }
    }

    /**
     * 打开等待框
     */
    override fun showLoading(message: String) {
        showLoadingExt(message)
    }

    /**
     * 关闭等待框
     */
    override fun dismissLoading() {
        dismissLoadingExt()
    }

    fun isLoading(): Boolean {
        return isLoadingShow()
    }

    fun openBigImage(view: AppCompatImageView, orgIcon: String) {
        OpenImage.with(context)
            .setClickImageView(view)
            .setSrcImageViewScaleType(ImageView.ScaleType.CENTER_CROP, true)
            .setImageUrl(orgIcon, MediaType.IMAGE).show()
    }

    override fun onPause() {
        super.onPause()
        LoadingUtil.forceDismiss()
        hideSoftKeyboard(activity)
        if (job != null) {
            job?.cancel()
            job = null
        }
    }

    /**
     * 延迟加载 防止 切换动画还没执行完毕时数据就已经加载好了，这时页面会有渲染卡顿  bug
     * 这里传入你想要延迟的时间，延迟时间可以设置比转场动画时间长一点 单位： 毫秒
     * 不传默认 300毫秒
     * @return Long
     */
    override fun lazyLoadTime(): Long {
        return 300
    }

    override fun onDestroyView() {
        super.onDestroyView()
        if (job != null) {
            job?.cancel()
            job = null
        }
    }

    fun showLoadingAntiShake(text: String? = getString(R.string.loading)) {
        if (lifecycle.currentState == Lifecycle.State.STARTED) {
            context?.let { LoadingUtil.show(it, text) }
        }
    }

    fun dismissLoadingAntiShake() {
        context?.let { LoadingUtil.dismiss(it) }
    }
}